Notions étendues d'entrées-sorties

(Merci à Pierre-Antoine Champin pour la rédaction de ce rappel de cours)

On peut considérer que tout algorithme a nécessairement des entrées et des sorties, mais que la manière dont ces entrées-sorties sont communiquées avec l'extérieur (leur "mode de transmission") varie d'un algorithme à l'autre.

Par exemple, les trois algorithmes suivants effectuent le même calcul, mais échangent leurs entrées-sorties de trois manières différentes.


In [ ]:
'''
:entrée n: int, SAISIE au clavier
:pré-cond: n ≥ 0
:sortie f: int, AFFICHÉE à l'écran
:post-cond: f = n! = 1×2×3×...×n
'''
n = int(input("Valeur de n (entier positif ou nul) ? "))
f = 1
i = 2
while i < n:
    f = f*i
    i = i+1
print(f)

In [ ]:
'''
:entrée n: int, AFFECTÉE précédemment
:pré-cond: n ≥ 0
:sortie f: int, AFFECTÉE pour la suite
:post-cond: f = n! = 1×2×3×...×n
'''
f = 1
i = 2
while i < n:
    f = f*i
    i = i+1

In [ ]:
def fact(n):
    '''
    :entrée n: int, PASSÉE en paramètre
    :pré-cond: n ≥ 0
    :sortie f: int, RETOURNÉE
    :post-cond: f = n! = 1×2×3×...×n
    '''
    f = 1
    i = 2
    while i < n:
        f = f*i
        i = i+1
    return f

On admettra que, dans une fonction, lorsque qu'on ne spécifie pas le mode de transmission des entrées-sorties, il est forcément "PASSÉE en paramètre" pour les entrées, et "RETOURÉE" pour les sorties.

Mais certaines fonctions utilisent d'autres modes de transmission, par exemple :


In [ ]:
# la fonction input fournie par Python (version sans paramètre)
def input():
    """
    :entrée txt1: str, SAISIE au clavier
    :sortie txt2: str
    :post-cond: txt2 = txt1
    """
    
# la fonction print fournie par Python
def print(val1):
    """
    :entrée val1: une valeur quelconque
    :sortie val2: une valeur quelconque, AFFICHÉE à l'écran
    :post-cond: val2 = val1
    """

Notons cependant que les entrées-sorties d'une fonction ne peuvent pas avoir pour mode de transmission "AFFECTÉE précédemment" ou "AFFECTÉE pour la suite", puisque les variables d'une fonction n'existent qu'à l'intérieur de cette fonction.

Fonction et procédure

On a appelé "fonction" tout algorithme défini par le mot-clé def. C'est effectivement le terme général employé dans la plupart des langages de programmation.

Cela dit, il est parfois nécessaire de distinguer plusieurs types de fonction (au sens large).

  • Dans son sens strict, le terme fonction désigne un algorithme dont toutes les entrées sont PASSÉES en paramètre, et toutes les sorties sont RETOURNÉES (par exemple, la fonction fact ci-dessus).

  • On appelle procédure un algorithme dont aucune sortie n'est RETOURNÉE (par exemple, la fonction print de Python).

La dénomination des algorithmes ne rentrant dans aucune de ces deux catégorie varie d'une personne à l'autre ; par exemple, la fonction input de Python sera appelée "fonction" par certains (parce qu'elle retourne une valeur), et "procédure" par d'autres (parce que ce n'est pas une fonction au sens strict, son entrée n'est pas passée en paramètre).

Exercice 1 Écrire un algorithme qui recherche si un entier est contenu dans un tableau. Vous écrirez également le contrat et ferez bien attention à expliquer si vous manipulez des entrées, des sorties ou les deux.


In [4]:
def rechercheTab(tab, nb):
    '''
    :entree tab: un tableau d'entiers 
    :entree nb: le nombre recherché
    :sortie present: un booleen qui indique si le nombre est présent dans le tableau ou non 
    :pré-condition: le tableau peut être vide
    '''
    present = False
    i = 0
    while (i < len(tab)) and (present == False):
        if tab[i] == nb:
            present = True
        i = i + 1
    return present

print(rechercheTab([3, 6, 4, 5, 9], 6))
print(rechercheTab([3, 6, 4, 5, 9], 1))
print(rechercheTab([], 2))


True
False
False

In [5]:
# Même solution (et même contrat), mais avec un for à la place du while
# Attention, on va parcourir tout le tableau même si on n'en a pas besoin
def rechercheTabBis(tab, nb):
    present = False
    for i in range(len(tab)):
        if tab[i] == nb:
            present = True
            
    return present
    
print(rechercheTabBis([3, 6, 4, 5, 9], 6))
print(rechercheTabBis([3, 6, 4, 5, 9], 1))
print(rechercheTabBis([], 2))


True
False
False

Exercice 2 Écrire un algorithme qui remplace tous les élements du tableau par leur double. Vous écrirez également le contrat.


In [6]:
def doublerTableau(tab):
    '''
    :entree-sortie: tab un tableau d'entiers ou de flottants
    :pre-condition: aucune
    :post-condition: le tableau est modifié. Chaque case contient le double de la valeur qu'elle contenait précédemment
    '''
    for i in range(len(tab)):
        tab[i] = 2*tab[i]
    
    return tab

print(doublerTableau([]))
print(doublerTableau([2,4,7,9]))


[]
[4, 8, 14, 18]

In [ ]: